﻿using System;

namespace ValidationHelper.Validators
{
    public class CpfValidator : StringValidator
    {
        #region Construtores
        public CpfValidator(string message, Type exceptionType, string stringToValidate)
            : base(message, exceptionType, stringToValidate)
        {
        }
        #endregion

        #region Métodos
        protected override bool IsNotValid()
        {
            return !IsCpfValid();
        }

        private bool IsCpfValid()
        {
            // Se for vazio
            if (String.IsNullOrEmpty(StringToValidate))
                return false;

            // Retirar todos os caracteres que não sejam numéricos
            string aux = string.Empty;
            for (int i = 0; i < StringToValidate.Length; i++)
            {
                if (char.IsNumber(StringToValidate[i]))
                    aux += StringToValidate[i].ToString();
            }

            // O tamanho do CPF tem que ser 11
            if (aux.Length != 11)
                return false;

            // Guardo o dígito para comparar no final
            string pDigito = aux.Substring(9, 2);
            aux = aux.Substring(0, 9);

            //Cálculo do 1o. digito do CPF
            aux += GerarDigito(aux);

            //Cálculo do 2o. digito do CPF
            aux += GerarDigito(aux);

            return pDigito == aux.Substring(9, 2);
        }

        private string GerarDigito(string cpf)
        {
            int Peso = 2;
            int Soma = 0;

            for (int i = cpf.Length - 1; i >= 0; i--)
            {
                Soma += Peso * Convert.ToInt32(cpf[i].ToString());
                Peso++;
            }

            int pNumero = 11 - (Soma % 11);

            if (pNumero > 9)
                pNumero = 0;

            return pNumero.ToString();
        }
        #endregion
    }
}
